// 对 axios 进行封装处理(所有请求都将使用这个文件暴露出去的方法，那么所有请求都将携带请求头验证)
import axios from 'axios';
// 1.在axios的基础上他有一个create的方法，
// 可以添加我们想要的东西，
// 并且新建一个他的对象
const instance = axios.create({
    baseURL: 'http://localhost:3000',
    timeout: 5000 // (设置请求时间)如果这次请求超过5秒就报错
})
// 2.配置 axios 请求拦截器
// （也就是在请求的时候会被拦截下来(不管有没有请求头都会发送过去)，做一步我们要做的事情）
instance.interceptors.request.use((config) => {
    // 拦截成功
    // 2.1 获取 token
    const token = localStorage.token;
    // 2.2 将 token 添加到请求头的 Authorization 属性中
    config.headers.Authorization = 'Bearer ' + token;
    return config;
}, (err) => {
    // 拦截失败
    return err;
});
// 3.配置 axios 响应拦截器
// （响应结果，也就是服务器发数据过来了，成功 我们通过，
//  失败的话，我们拦截下来做一些我们的提示或者其他处理）
instance.interceptors.response.use((res) => {
    // 响应成功
    return res; // { data: {} }
}, (err) => {
    // 响应失败
    // 判断错误类型，并将错误的描述添加到 err.message 属性上
    if (err && err.response) {
        switch (err.response.status) {
            case 400:
                err.message = '请求错误(400)';
                break;
            case 401:
                err.message = '身份认证失败(401)';
                break;
            case 403:
                err.message = '拒绝访问(403)';
                break;
            case 404:
                err.message = '请求出错(404)';
                break;
            case 408:
                err.message = '请求超时(408)';
                break;
            case 500:
                err.message = '服务器错误(500)';
                break;
            case 501:
                err.message = '服务未实现(501)';
                break;
            case 502:
                err.message = '网络错误(502)';
                break;
            case 503:
                err.message = '服务不可用(503)';
                break;
            case 504:
                err.message = '网络超时(504)';
                break;
            case 505:
                err.message = 'HTTP版本不受支持(505)';
                break;
            default:
                err.message = `连接出错(${err.response.status})!`;
        }
        return {
            data: {
                status: 0,
                type: err.response.status,
                message: err.message
            }
        }
    } else {
        err.message = '服务器连接失败！';
        return {
            data: {
                status: 0,
                message: err.message
            }
        }
    }
});
// 4.最后我们把我们包装好的 axios 暴露出去(那么所有请求都是用我们封装后的请求了)
export default instance;